package com.xypower.java8;

import java.util.NoSuchElementException;
import java.util.Optional;

public class OptionalTest {
    public static void main(String[] args) {

        //Optional.ofNullable()方法
        //获取的对象为null返回一个空的对象new Optional<>();
        String text = null;
        Optional<String> text1 = Optional.ofNullable(text);
        if (text1==null){
            System.out.println("1");
        }
        if (text1!=null) {
            System.out.println("2");
        }


        //Optional.get方法
        //如果为null,get()方法，会自动抛异常NoSuchElementException "No value present"

        try {
            System.out.println(text1.get());
        }catch (NoSuchElementException e){
            System.out.println("捕获到NoSuchElementException对象，他的异常信息是"+e.getMessage());
        }


        //Optional.of()方法
        //直接返回一个Optional对象,如果为null会抛空指针异常
        try {
            Optional<String> text2 = Optional.of(text);
            System.out.println(text2);
        }catch (NullPointerException e){
            System.out.println("捕获到NullPointerException对象，他的异常信息是"+e.getMessage());
        }


        //isPresent：如果值存在返回true，否则返回false。
        //ifPresent：如果Optional实例有值则为其调用consumer，否则不做处理
        //get：如果Optional有值则将其返回，否则抛出NoSuchElementException。因此也不经常用。
        //orElse：如果有值则将其返回，否则返回指定的其它值。
        //orElseGet：orElseGet与orElse方法类似，区别在于得到的默认值。orElse方法将传入的字符串作为默认值，orElseGet方法可以接受Supplier接口的实现用来生成默认值
        //orElseThrow：如果有值则将其返回，否则抛出supplier接口创建的异常。
        //filter：如果有值并且满足断言条件返回包含该值的Optional，否则返回空Optional。
        //map：如果有值，则对其执行调用mapping函数得到返回值。如果返回值不为null，则创建包含mapping返回值的Optional作为map方法返回值，否则返回空Optional。
        //flatMap：如果有值，为其执行mapping函数返回Optional类型返回值，否则返回空Optional
    }
}
